package cn.iocoder.yudao.module.reading.service.bookset;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.reading.controller.admin.bookset.vo.BookSetCreateReqVO;
import cn.iocoder.yudao.module.reading.controller.admin.bookset.vo.BookSetPageReqVO;
import cn.iocoder.yudao.module.reading.controller.admin.bookset.vo.BookSetUpdateReqVO;
import cn.iocoder.yudao.module.reading.controller.app.bookset.vo.BookSetDetailRespVO;
import cn.iocoder.yudao.module.reading.dal.dataobject.bookset.BookSetDO;

import java.util.List;

/**
 * 绘本集 Service 接口
 *
 * @author 芋道源码
 */
public interface BookSetService {

    /**
     * 获得绘本集
     *
     * @param id 编号
     * @return 绘本集
     */
    BookSetDO getBookSet(Long id);

    /**
     * 获得绘本集详情（包含绘本列表和阅读状态）
     *
     * @param id     绘本集编号
     * @param userId 用户ID
     * @return 绘本集详情
     */
    BookSetDetailRespVO getBookSetDetail(Long id, Long userId);

    /**
     * 获得绘本集分页（APP用户）
     *
     * @param pageReqVO 分页查询
     * @param userId    用户ID（用于过滤回收站）
     * @return 绘本集分页
     */
    PageResult<BookSetDO> getBookSetPage(cn.iocoder.yudao.module.reading.controller.app.bookset.vo.BookSetPageReqVO pageReqVO, Long userId);

    /**
     * 获得绘本集分页（管理员）
     *
     * @param pageReqVO 分页查询
     * @return 绘本集分页
     */
    PageResult<BookSetDO> getBookSetPage(cn.iocoder.yudao.module.reading.controller.admin.bookset.vo.BookSetPageReqVO pageReqVO);

    /**
     * 根据语言和分类获得推荐绘本集
     *
     * @param language   语言类型
     * @param categoryId 分类ID
     * @param limit      限制数量
     * @param userId     用户ID（用于过滤回收站）
     * @return 绘本集列表
     */
    List<BookSetDO> getRecommendedBookSets(String language, Long categoryId, Integer limit, Long userId);

    /**
     * 根据分类获得绘本集
     *
     * @param categoryId 分类ID
     * @param limit      限制数量
     * @param userId     用户ID（用于过滤回收站）
     * @return 绘本集列表
     */
    List<BookSetDO> getBookSetsByCategory(Long categoryId, Integer limit, Long userId);

    /**
     * 搜索绘本集
     *
     * @param keyword  关键词
     * @param language 语言类型
     * @param userId   用户ID（用于过滤回收站）
     * @return 绘本集列表
     */
    List<BookSetDO> searchBookSets(String keyword, String language, Long userId);

    /**
     * 分页搜索绘本集
     *
     * @param keyword  关键词
     * @param language 语言类型
     * @param pageNo   页码
     * @param pageSize 每页数量
     * @param userId   用户ID（用于过滤回收站）
     * @return 绘本集分页结果
     */
    PageResult<BookSetDO> searchBookSets(String keyword, String language, Integer pageNo, Integer pageSize, Long userId);

    // =============================================
    // 向后兼容的方法（不过滤回收站）
    // =============================================

    /**
     * 根据语言和分类获得推荐绘本集（不过滤回收站）
     */
    List<BookSetDO> getRecommendedBookSets(String language, Long categoryId, Integer limit);

    /**
     * 根据分类获得绘本集（不过滤回收站）
     */
    List<BookSetDO> getBookSetsByCategory(Long categoryId, Integer limit);

    /**
     * 搜索绘本集（不过滤回收站）
     */
    List<BookSetDO> searchBookSets(String keyword, String language);

    // =============================================
    // 管理员操作方法
    // =============================================

    /**
     * 创建绘本集
     *
     * @param createReqVO 创建信息
     * @return 绘本集编号
     */
    Long createBookSet(BookSetCreateReqVO createReqVO);

    /**
     * 更新绘本集
     *
     * @param updateReqVO 更新信息
     */
    void updateBookSet(BookSetUpdateReqVO updateReqVO);

    /**
     * 删除绘本集
     *
     * @param id 编号
     */
    void deleteBookSet(Long id);

    /**
     * 获取下一个绘本集ID
     * 用于文件上传时预先获取ID
     *
     * @return 下一个绘本集ID
     */
    Long getNextBookSetId();

    /**
     * 更新绘本集的绘本数量
     * 根据绘本集ID统计实际绘本数量并更新到绘本集记录中
     *
     * @param bookSetId 绘本集ID
     */
    void updateBookSetBookCount(Long bookSetId);

    /**
     * 获得绘本集列表
     *
     * @param language 语言类型
     * @param title    标题
     * @return 绘本集列表
     */
    List<BookSetDO> getBookSetList(String language, String title);

    /**
     * 批量删除绘本集
     *
     * @param ids 编号列表
     */
    void batchDeleteBookSet(List<Long> ids);

    /**
     * 批量更新绘本集状态
     *
     * @param ids      编号列表
     * @param isActive 是否启用
     */
    void batchUpdateBookSetStatus(List<Long> ids, Boolean isActive);

}
